Adding some more judges, here and there.
[and.git] / ICPC Live Archive / 3928 - Ballroom lights / help / gomox.ar-pap-2010-d9b17e5cb110 / tpc / doc / billing-tables.tex
blob7fee4d2666f71a220f9a693aca9731056d7027ee
1 \newcommand{\entrada}[3]{\ensuremath{[#1\text{|}#2\mapsto#3]}}
3 \section{3703 - Billing tables}
4 \textbf{Problema:}
5 Se tiene una tabla de entradas, cada una de las cuales describe un conjunto
6 de cadenas y tiene asociado un valor. Las cadenas descriptas est\'an siempre
7 formadas por once d\'igitos num\'ericos. Cada entrada es de
8 la forma $\entrada{a_1...a_k...a_n}{b_k ... b_n}{v}$
9 con $a_k ... a_n \leq b_k ... b_n$,
10 lo cual engloba a las cadenas $\{x\ |\ a_1 ... a_n \leq x \leq a_1 ... a_{k-1} b_k ... b_n\}$
11 (donde $\leq$~es el orden lexicogr\'afico).
12 El valor asociado a una cadena $s$ es el valor $v$ de la primera entrada
13 de la tabla que engloba a $s$.
15 El problema es convertir la tabla de entradas en un diccionario
16 equivalente (i.e. que asigne los mismos valores a las mismas cadenas).
17 Cada entrada del diccionario debe ser de la forma
18 $a_1 ... a_n \mapsto v$, lo cual asocia una cadena $s$ a $v$ sii
19 $a_1 ... a_n$ es prefijo de $s$. Ninguna entrada del
20 diccionario puede ser prefijo de otra. Adem\'as, el diccionario
21 debe ser m\'inimo en cantidad de entradas.
23 \subsection{Resoluci\'on}
25 \subsubsection{Representaci\'on del diccionario}
27 El problema se resuelve construyendo un \textit{trie} que representa
28 el diccionario. El \textit{trie} cumple con el siguiente invariante:
30 \begin{enumerate}
31 \item Las hojas tienen asociado un valor
32 \item Los nodos internos no tienen asociado un valor.
33 \item Todo nodo interno tiene exactamente 10 hijos (no le faltan hijos).
34 \item Si un nodo $x$ es interno, sea $L$ el conjunto de valores que figuran
35 en el sub\'arbol cuya ra\'iz es $x$. Entonces $\#L > 1$.
36 (Notar que, por la condici\'on 1, $\#L \geq 1$).
37 \end{enumerate}
39 Un \textit{trie} de estas caracter\'isticas representa un diccionario m\'inimo.
40 Las entradas del diccionario est\'an dadas por las ramas del \textit{trie}
41 y por lo tanto ninguna entrada es prefijo de otra.
42 Adem\'as, el diccionario $D$ es m\'inimo en cantidad de entradas.
43 Suponer que hubiera un diccionario $D'$ m\'as chico.
44 Para que $D$ y $D'$ sean equivalentes, todas las cadenas
45 de $D$ deben estar representadas por alguna entrada de $D'$.
46 Si todas las entradas de $D'$ fueran extensiones de las
47 entradas de $D$, entonces $D'$ tendr\'ia al menos tantas
48 entradas como $D$ y no ser\'ia m\'as chico.
49 Entonces hay al menos una entrada de $D'$ de la forma
50 $a_1 ... a_k \mapsto v$ que es un prefijo de alguna
51 entrada de $D$ de la forma $a_1 ... a_k ... a_n \mapsto v_1$.
52 Por la condici\'on 4, en $D$ debe haber otra entrada
53 $a_1 ... a_k b_{k+1} ... b_n \mapsto v_2$ con $v_1 \neq v_2$.
54 Por lo tanto $D$ y $D'$ no pueden ser equivalentes.
56 \subsubsection{Construcci\'on del diccionario a partir de la tabla}
58 El diccionario se construye tomando las entradas de la tabla
59 original y recorri\'endolas desde abajo hacia arriba.
60 El razonamiento inductivo es que si se tiene un diccionario $D$
61 equivalente a una tabla $T$, se puede construir un nuevo
62 diccionario $D'$ equivalente a la tabla $\entrada{a_1...a_k...a_n}{b_k...b_n}{v} \cdot T$
63 insertando en $D$ una cierta cantidad de elementos.
64 Adem\'as, el \textit{trie} de $D$ se construye respetando el invariante,
65 de modo tal que, por el razonamiento anterior, $D$ es m\'inimo.
67 Para agregar la entrada $\entrada{a_1...a_k...a_n}{b_k...b_n}{v}$,
68 ser\'ia posible insertar en el diccionario todas las cadenas de la forma
69 $a_1...a_{k-1}c_k...c_n$ tales que $a_k...a_n \leq c_k...c_n \leq b_k...b_n$.
70 Esto ser\'ia correcto pero potencialmente muy ineficiente.
71 Por ejemplo, en el peor caso, $\entrada{0^{L}}{9^{L}}{v}$
72 requerir\'ia insertar todas las cadenas de longitud $L$,
73 que es claramente exponencial en el tama\~no de la entrada.
75 En lugar de hacer esto, se puede insertar una cantidad de
76 cadenas lineal en el tama\~no de la entrada (por el tama\~no
77 del alfabeto, que en este caso es suficientemente chico como
78 para ser considerado constante).
79 Por ejemplo, para agregar $\entrada{7400}{499}{v}$ es redundante
80 insertar todos los valores intermedios $7400, 7401, 7402, \hdots, 7499$;
81 basta con insertar $74$. Esto es consistente con la condici\'on 4
82 del invariante del \textit{trie}.
84 En general, para agregar $\entrada{a_1...a_k...a_n}{b_k...b_n}{v}$
85 se insertan todas las cadenas de la forma $a_1...a_{n-1}d$
86 y todas las cadenas de la forma $a_1...a_{k-1}b_k...b_{n-1}d$
87 (para todo valor de $d$ que haga que dichas cadenas est\'en en el rango). Una vez hecho esto,
88 se aplica recursivamente el mismo procedimiento
89 para agregar $\entrada{a_1...a_k...a_{n-1}}{b_k...b_{n-1}}{v}$.
90 Esto requiere a lo sumo $n$ pasos, y en cada
91 paso se insertan a lo sumo $2|\Sigma|$ cadenas, siendo $|\Sigma|$ la cantidad de elementos
92 del alfabeto que se utiliza.
94 Por ejemplo, para agregar \entrada{7377}{643}{v} se
95 insertan las siguientes cadenas:
97 \begin{itemize}
98 \item $7377, 7378, 7379$
99 \item $738, 739$
100 \item $74, 75$
101 \item $760, 761, 762, 763$
102 \item $7640, 7641, 7642, 7643$
103 \end{itemize}
105 El algoritmo que lista dichas cadenas se implementa
106 de manera iterativa, representando las cadenas de
107 d\'igitos como enteros de 64 bits.
109 \subsubsection{Modificaciones del algoritmo de inserci\'on}
111 Para mantener el invariante del \textit{trie}, las inserciones usan el algoritmo
112 habitual, con las siguientes modificaciones:
114 \begin{itemize}
115 \item Cuando se va a insertar una cadena $\alpha \beta \mapsto v$
116 en una hoja de la forma $\alpha \mapsto w$, se elimina el valor
117 $w$ de la hoja (para cumplir con la condici\'on 2, porque va a pasar
118 a ser un nodo interno). Se completan los hijos de la hoja, agregando
119 $\alpha d \mapsto w$ para todo $d \in \Sigma$ para cumplir con la
120 condici\'on 3. Despu\'es se prosigue insertando
121 $\alpha \beta \mapsto v$ en el hijo que corresponda.
123 \item Una vez que se insert\'o una cadena, a medida que se
124 va subiendo por los nodos (al volver de la recursi\'on), se
125 garantiza que se cumpla con la condici\'on 4 de la siguiente
126 manera: si todos los hijos de un nodo son hojas cuyo valor
127 es $v$, se eliminan todos los hijos y se etiqueta el nodo
128 actual con $v$. (Los hijos del nodo ya cumplen con la
129 condici\'on 4 del invariante; por lo tanto, si alguno de
130 ellos no es una hoja, hay al menos dos valores diferentes
131 en el sub\'arbol analizado).
132 \end{itemize}
134 \subsubsection{Complejidades}
136 Por lo visto arriba, en peor caso, el costo de insertar una
137 cadena de longitud $n$ en el \textit{trie} es $O(n |\Sigma|)$.
139 La complejidad total del algoritmo es la siguiente:
140 la tabla original tiene $k$ entradas. La $i$-\'esima
141 entrada describe prefijos de longitud $n_i$. Para cada
142 entrada, es necesario insertar a lo sumo $2 |\Sigma| n_i$
143 cadenas, cada una de longitud $n_i$.
144 En peor caso, el costo de insertar todas las cadenas asociadas
145 a una entrada es $O(n_i^2 |\Sigma|^2)$. %TODO: No llego a entender de donde sale esto (Fede)
147 El costo de insertar todas las entradas es
148 $O(\sum_{i=1}^{k}{n_i^2 |\Sigma|^2})$ en peor
149 caso. Adem\'as, se puede acotar la longitud del
150 prefijo por la longitud m\'axima de las cadenas:
151 $n_i \leq L = 11$, con lo cual el costo de insertar
152 todas las cadenas de una tabla es $O(k L^2 |\Sigma|^2)$.
154 Los valores $v$ asociados a cada entrada son cadenas
155 de longitud acotada (y razonablemente chica).
156 Para (potencialmente) usar menos memoria y comparar
157 las cadenas de manera m\'as simple, se guardan en un
158 \texttt{set<string>} y se representan los valores
159 con un puntero. En una tabla de $k$ entradas hay a lo
160 sumo $k$ valores, y por lo tanto esto introduce un costo
161 adicional de $O(V \log k)$ donde $V = 20$ es la
162 longitud m\'axima de las cadenas que describen valores.
164 Por \'ultimo, el costo de iterar el diccionario e imprimirlo
165 es el siguiente: recorrer el \textit{trie} es lineal en la cantidad
166 de nodos del mismo, que es a lo sumo $O(k L^2 |\Sigma|^2)$
167 (resultan de insertar $O(k L |\Sigma|)$ cadenas, cada una de las
168 cuales agrega como mucho $O(L |\Sigma|)$ nodos).
169 Para cada hoja, se imprime el prefijo que le corresponde
170 al nodo en cuesti\'on, de largo $L$, y el valor asociado, de largo $V$.
172 Notando que $V \in O(L)$ y que el costo de mantener el conjunto
173 de cadenas $O(V \log k)$ est\'a inclu\'ido en el costo de las
174 dem\'as operaciones, el costo total en peor caso es
175 $O(k L^3 |\Sigma|^2)$.
176 Si se desprecian las constantes $L = 11$, $|\Sigma| = 10$ por
177 ser $O(1)$, la complejidad en peor caso es $O(k)$.
179 \subsection{Implementación}
180 \noindent
181 \ttfamily
182 \shorthandoff{"}\\
183 \hlstd{}\hlline{\ 1\ }\hldir{\#include\ $<$string$>$}\\
184 \hlline{\ 2\ }\hlstd{}\hldir{\#include\ $<$map$>$}\\
185 \hlline{\ 3\ }\hlstd{}\hldir{\#include\ $<$set$>$}\\
186 \hlline{\ 4\ }\hlstd{}\hldir{\#include\ $<$vector$>$}\\
187 \hlline{\ 5\ }\hlstd{}\hldir{\#include\ $<$stack$>$}\\
188 \hlline{\ 6\ }\hlstd{}\hldir{\#include\ $<$iostream$>$}\\
189 \hlline{\ 7\ }\hlstd{}\hldir{\#include\ $<$sstream$>$}\\
190 \hlline{\ 8\ }\hlstd{}\hldir{\#include\ $<$iomanip$>$}\\
191 \hlline{\ 9\ }\hlstd{}\hldir{\#include\ $<$cassert$>$}\\
192 \hlline{10\ }\hlstd{}\hldir{\#include\ $<$cstdlib$>$}\\
193 \hlline{11\ }\hlstd{}\hldir{\#include\ $<$stdio.h$>$}\\
194 \hlline{12\ }\hlstd{}\\
195 \hlline{13\ }\hlkwa{using\ namespace\ }\hlstd{std}\hlsym{;}\\
196 \hlline{14\ }\hlstd{}\\
197 \hlline{15\ }\hldir{\#define\ forsn(i,\ s,\ n)\ for\ (int\ i\ =\ (s);\ i\ $<$\ (n);\ i++)}\\
198 \hlline{16\ }\hlstd{}\hldir{\#define\ forn(i,\ n)\ forsn\ (i,\ 0,\ n)}\\
199 \hlline{17\ }\hlstd{}\hldir{\#define\ dforn(i,\ n)\ for\ (int\ i\ =\ (n);\ i{-}{-}\ $>$\ 0;)}\\
200 \hlline{18\ }\hlstd{}\\
201 \hlline{19\ }\hldir{\#define\ ALPHA\textunderscore SIZE\ 10}\\
202 \hlline{20\ }\hlstd{}\hldir{\#define\ ALPHA\textunderscore VAL(C)\ ((C)\ {-}\ }\hldstr{`0`}\hldir{)}\\
203 \hlline{21\ }\hlstd{}\hldir{\#define\ foralpha(x)\ forn\ (x,\ ALPHA\textunderscore SIZE)}\\
204 \hlline{22\ }\hlstd{}\\
205 \hlline{23\ }\hlkwc{typedef\ }\hlstd{}\hlkwb{unsigned\ long\ long\ int\ }\hlstd{lluint}\hlsym{;}\\
206 \hlline{24\ }\hlstd{}\\
207 \hlline{25\ }\hlkwc{typedef\ }\hlstd{}\hlkwb{const\ }\hlstd{string\ }\hlsym{{*}}\hlstd{Value}\hlsym{;}\\
208 \hlline{26\ }\hlstd{\\
209 \hlline{27\ }string\ }\hlkwd{itos}\hlstd{}\hlsym{(}\hlstd{lluint\ i}\hlsym{,\ }\hlstd{}\hlkwb{int\ }\hlstd{width}\hlsym{)\ \{}\\
210 \hlline{28\ }\hlstd{\ }\hlkwa{if\ }\hlstd{}\hlsym{(}\hlstd{width\ }\hlsym{==\ }\hlstd{}\hlnum{0}\hlstd{}\hlsym{)\ }\hlstd{}\hlkwa{return\ }\hlstd{}\hlstr{``''}\hlstd{}\hlsym{;}\\
211 \hlline{29\ }\hlstd{\ ostringstream\ os}\hlsym{;}\\
212 \hlline{30\ }\hlstd{\ os\ }\hlsym{$<$$<$\ }\hlstd{}\hlkwd{setw}\hlstd{}\hlsym{(}\hlstd{width}\hlsym{)\ $<$$<$\ }\hlstd{}\hlkwd{setfill}\hlstd{}\hlsym{(}\hlstd{}\hlstr{`0`}\hlstd{}\hlsym{)\ $<$$<$\ }\hlstd{i}\hlsym{;}\\
213 \hlline{31\ }\hlstd{\ }\hlkwa{return\ }\hlstd{os}\hlsym{.}\hlstd{}\hlkwd{str}\hlstd{}\hlsym{();}\\
214 \hlline{32\ }\hlstd{}\hlsym{\}}\\
215 \hlline{33\ }\hlstd{}\\
216 \hlline{34\ }\hlcom{/{*}{*}{*}{*}\ String\ register\ {*}{*}{*}{*}/}\hlstd{\\
217 \hlline{35\ }\\
218 \hlline{36\ }set}\hlsym{$<$}\hlstd{string}\hlsym{$>$\ }\hlstd{\textunderscore reg}\hlsym{;}\\
219 \hlline{37\ }\hlstd{\\
220 \hlline{38\ }Value\ }\hlkwd{reg\textunderscore intern}\hlstd{}\hlsym{(}\hlstd{}\hlkwb{const\ }\hlstd{string}\hlsym{\&\ }\hlstd{s}\hlsym{)\ \{}\\
221 \hlline{39\ }\hlstd{\ }\hlkwa{return\ }\hlstd{}\hlsym{\&{*}}\hlstd{\textunderscore reg}\hlsym{.}\hlstd{}\hlkwd{insert}\hlstd{}\hlsym{(}\hlstd{s}\hlsym{).}\hlstd{first}\hlsym{;}\\
222 \hlline{40\ }\hlstd{}\hlsym{\}}\\
223 \hlline{41\ }\hlstd{}\\
224 \hlline{42\ }\hlkwb{void\ }\hlstd{}\hlkwd{reg\textunderscore free}\hlstd{}\hlsym{()\ \{}\\
225 \hlline{43\ }\hlstd{\ \textunderscore reg\ }\hlsym{=\ }\hlstd{set}\hlsym{$<$}\hlstd{string}\hlsym{$>$();}\\
226 \hlline{44\ }\hlstd{}\hlsym{\}}\\
227 \hlline{45\ }\hlstd{}\\
228 \hlline{46\ }\hlcom{/{*}{*}{*}{*}\ Trie\ {*}{*}{*}{*}/}\hlstd{}\\
229 \hlline{47\ }\\
230 \hlline{48\ }\hlkwb{struct\ }\hlstd{Node\ }\hlsym{\{}\\
231 \hlline{49\ }\hlstd{\ Node\ }\hlsym{{*}}\hlstd{children}\hlsym{{[}}\hlstd{ALPHA\textunderscore SIZE}\hlsym{{]};}\\
232 \hlline{50\ }\hlstd{\ Value\ value}\hlsym{;}\\
233 \hlline{51\ }\hlstd{}\hlsym{\};}\\
234 \hlline{52\ }\hlstd{}\\
235 \hlline{53\ }\hlkwc{typedef\ }\hlstd{Node\ }\hlsym{{*}}\hlstd{Trie}\hlsym{;}\\
236 \hlline{54\ }\hlstd{}\hldir{\#define\ trie\textunderscore new()\ NULL}\\
237 \hlline{55\ }\hlstd{}\hldir{\#define\ Empty}\hlstd{\ \ }\hldir{NULL}\\
238 \hlline{56\ }\hlstd{}\\
239 \hlline{57\ }\hlkwb{void\ }\hlstd{}\hlkwd{trie\textunderscore free}\hlstd{}\hlsym{(}\hlstd{Trie\ tr}\hlsym{)\ \{}\\
240 \hlline{58\ }\hlstd{\ }\hlkwa{if\ }\hlstd{}\hlsym{(!}\hlstd{tr}\hlsym{)\ }\hlstd{}\hlkwa{return}\hlstd{}\hlsym{;}\\
241 \hlline{59\ }\hlstd{\ }\hlkwd{foralpha\ }\hlstd{}\hlsym{(}\hlstd{dig}\hlsym{)\ \{}\\
242 \hlline{60\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwd{trie\textunderscore free}\hlstd{}\hlsym{(}\hlstd{tr}\hlsym{{-}$>$}\hlstd{children}\hlsym{{[}}\hlstd{dig}\hlsym{{]});}\\
243 \hlline{61\ }\hlstd{\ }\hlsym{\}}\\
244 \hlline{62\ }\hlstd{\ }\hlkwa{delete\ }\hlstd{tr}\hlsym{;}\\
245 \hlline{63\ }\hlstd{}\hlsym{\}}\\
246 \hlline{64\ }\hlstd{}\\
247 \hlline{65\ }\hlkwb{void\ }\hlstd{}\hlkwd{\textunderscore trie\textunderscore delete\textunderscore children}\hlstd{}\hlsym{(}\hlstd{Trie\ tr}\hlsym{)\ \{}\\
248 \hlline{66\ }\hlstd{\ }\hlkwd{foralpha\ }\hlstd{}\hlsym{(}\hlstd{dig}\hlsym{)\ }\hlstd{}\hlkwa{if\ }\hlstd{}\hlsym{(}\hlstd{tr}\hlsym{{-}$>$}\hlstd{children}\hlsym{{[}}\hlstd{dig}\hlsym{{]})\ \{}\\
249 \hlline{67\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwd{trie\textunderscore free}\hlstd{}\hlsym{(}\hlstd{tr}\hlsym{{-}$>$}\hlstd{children}\hlsym{{[}}\hlstd{dig}\hlsym{{]});}\\
250 \hlline{68\ }\hlstd{}\hlstd{\ \ }\hlstd{tr}\hlsym{{-}$>$}\hlstd{children}\hlsym{{[}}\hlstd{dig}\hlsym{{]}\ =\ }\hlstd{NULL}\hlsym{;}\\
251 \hlline{69\ }\hlstd{\ }\hlsym{\}}\\
252 \hlline{70\ }\hlstd{}\hlsym{\}}\\
253 \hlline{71\ }\hlstd{}\\
254 \hlline{72\ }\hlkwb{void\ }\hlstd{}\hlkwd{\textunderscore trie\textunderscore collapse\textunderscore children}\hlstd{}\hlsym{(}\hlstd{Trie\ tr}\hlsym{)\ \{}\\
255 \hlline{73\ }\hlstd{\ }\hlkwa{if\ }\hlstd{}\hlsym{(!}\hlstd{tr}\hlsym{{-}$>$}\hlstd{children}\hlsym{{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}\ \textbar \textbar \ }\hlstd{tr}\hlsym{{-}$>$}\hlstd{children}\hlsym{{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}{-}$>$}\hlstd{value\ }\hlsym{==\ }\hlstd{Empty}\hlsym{)\ }\hlstd{}\hlkwa{return}\hlstd{}\hlsym{;}\\
256 \hlline{74\ }\hlstd{\ }\hlkwd{foralpha\ }\hlstd{}\hlsym{(}\hlstd{dig}\hlsym{)\ \{}\\
257 \hlline{75\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwa{if\ }\hlstd{}\hlsym{(!}\hlstd{tr}\hlsym{{-}$>$}\hlstd{children}\hlsym{{[}}\hlstd{dig}\hlsym{{]})\ }\hlstd{}\hlkwa{return}\hlstd{}\hlsym{;}\\
258 \hlline{76\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwa{if\ }\hlstd{}\hlsym{(}\hlstd{tr}\hlsym{{-}$>$}\hlstd{children}\hlsym{{[}}\hlstd{dig}\hlsym{{]}{-}$>$}\hlstd{value\ }\hlsym{!=\ }\hlstd{tr}\hlsym{{-}$>$}\hlstd{children}\hlsym{{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}{-}$>$}\hlstd{value}\hlsym{)\ }\hlstd{}\hlkwa{return}\hlstd{}\hlsym{;}\\
259 \hlline{77\ }\hlstd{\ }\hlsym{\}}\\
260 \hlline{78\ }\hlstd{\\
261 \hlline{79\ }\ tr}\hlsym{{-}$>$}\hlstd{value\ }\hlsym{=\ }\hlstd{tr}\hlsym{{-}$>$}\hlstd{children}\hlsym{{[}}\hlstd{}\hlnum{0}\hlstd{}\hlsym{{]}{-}$>$}\hlstd{value}\hlsym{;}\\
262 \hlline{80\ }\hlstd{\ }\hlkwd{\textunderscore trie\textunderscore delete\textunderscore children}\hlstd{}\hlsym{(}\hlstd{tr}\hlsym{);}\\
263 \hlline{81\ }\hlstd{}\hlsym{\}}\\
264 \hlline{82\ }\hlstd{}\\
265 \hlline{83\ }\hlslc{//\ invariante:\ los\ valores\ estan\ en\ las\ hojas}\\
266 \hlline{84\ }\hlstd{}\hlkwb{void\ }\hlstd{}\hlkwd{trie\textunderscore add}\hlstd{}\hlsym{(}\hlstd{Trie\ }\hlsym{{*}}\hlstd{tr}\hlsym{,\ }\hlstd{}\hlkwb{const\ char\ }\hlstd{}\hlsym{{*}}\hlstd{s}\hlsym{,\ }\hlstd{Value\ v}\hlsym{)\ \{}\\
267 \hlline{85\ }\hlstd{\ }\hlkwa{if\ }\hlstd{}\hlsym{({*}}\hlstd{tr\ }\hlsym{==\ }\hlstd{NULL}\hlsym{)\ \{}\\
268 \hlline{86\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlsym{{*}}\hlstd{tr\ }\hlsym{=\ }\hlstd{}\hlkwa{new\ }\hlstd{}\hlkwd{Node}\hlstd{}\hlsym{();}\\
269 \hlline{87\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwd{foralpha\ }\hlstd{}\hlsym{(}\hlstd{dig}\hlsym{)\ ({*}}\hlstd{tr}\hlsym{){-}$>$}\hlstd{children}\hlsym{{[}}\hlstd{dig}\hlsym{{]}\ =\ }\hlstd{NULL}\hlsym{;}\\
270 \hlline{88\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlsym{({*}}\hlstd{tr}\hlsym{){-}$>$}\hlstd{value\ }\hlsym{=\ }\hlstd{Empty}\hlsym{;}\\
271 \hlline{89\ }\hlstd{\ }\hlsym{\}}\\
272 \hlline{90\ }\hlstd{\ }\hlkwa{if\ }\hlstd{}\hlsym{(!{*}}\hlstd{s}\hlsym{)\ \{}\\
273 \hlline{91\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlsym{({*}}\hlstd{tr}\hlsym{){-}$>$}\hlstd{value\ }\hlsym{=\ }\hlstd{v}\hlsym{;}\\
274 \hlline{92\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwd{\textunderscore trie\textunderscore delete\textunderscore children}\hlstd{}\hlsym{({*}}\hlstd{tr}\hlsym{);}\\
275 \hlline{93\ }\hlstd{\ }\hlsym{\}\ }\hlstd{}\hlkwa{else\ }\hlstd{}\hlsym{\{}\\
276 \hlline{94\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwa{if\ }\hlstd{}\hlsym{(({*}}\hlstd{tr}\hlsym{){-}$>$}\hlstd{value\ }\hlsym{!=\ }\hlstd{Empty}\hlsym{)\ \{}\\
277 \hlline{95\ }\hlstd{}\hlstd{\ \ \ }\hlstd{}\hlkwd{foralpha\ }\hlstd{}\hlsym{(}\hlstd{dig}\hlsym{)\ \{}\\
278 \hlline{96\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwd{trie\textunderscore add}\hlstd{}\hlsym{(\&({*}}\hlstd{tr}\hlsym{){-}$>$}\hlstd{children}\hlsym{{[}}\hlstd{dig}\hlsym{{]},\ }\hlstd{}\hlstr{""}\hlstd{}\hlsym{,\ ({*}}\hlstd{tr}\hlsym{){-}$>$}\hlstd{value}\hlsym{);}\\
279 \hlline{97\ }\hlstd{}\hlstd{\ \ \ }\hlstd{}\hlsym{\}}\\
280 \hlline{98\ }\hlstd{}\hlstd{\ \ \ }\hlstd{}\hlsym{({*}}\hlstd{tr}\hlsym{){-}$>$}\hlstd{value\ }\hlsym{=\ }\hlstd{Empty}\hlsym{;}\\
281 \hlline{99\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlsym{\}}\\
282 \hlline{100\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwd{trie\textunderscore add}\hlstd{}\hlsym{(\&({*}}\hlstd{tr}\hlsym{){-}$>$}\hlstd{children}\hlsym{{[}}\hlstd{}\hlkwd{ALPHA\textunderscore VAL}\hlstd{}\hlsym{({*}}\hlstd{s}\hlsym{){]},\ \&}\hlstd{s}\hlsym{{[}}\hlstd{}\hlnum{1}\hlstd{}\hlsym{{]},\ }\hlstd{v}\hlsym{);}\\
283 \hlline{101\ }\hlstd{\\
284 \hlline{102\ }}\hlstd{\ \ }\hlstd{}\hlkwd{\textunderscore trie\textunderscore collapse\textunderscore children}\hlstd{}\hlsym{({*}}\hlstd{tr}\hlsym{);}\\
285 \hlline{103\ }\hlstd{\ }\hlsym{\}}\\
286 \hlline{104\ }\hlstd{}\hlsym{\}}\\
287 \hlline{105\ }\hlstd{}\\
288 \hlline{106\ }\hlkwb{bool\ }\hlstd{}\hlkwd{trie\textunderscore has\textunderscore children}\hlstd{}\hlsym{(}\hlstd{Trie\ tr}\hlsym{)\ \{}\\
289 \hlline{107\ }\hlstd{\ }\hlkwd{foralpha\ }\hlstd{}\hlsym{(}\hlstd{dig}\hlsym{)\ \{}\\
290 \hlline{108\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwa{if\ }\hlstd{}\hlsym{(}\hlstd{tr}\hlsym{{-}$>$}\hlstd{children}\hlsym{{[}}\hlstd{dig}\hlsym{{]}\ ==\ }\hlstd{NULL}\hlsym{)\ }\hlstd{}\hlkwa{continue}\hlstd{}\hlsym{;}\\
291 \hlline{109\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwa{return\ true}\hlstd{}\hlsym{;}\\
292 \hlline{110\ }\hlstd{\ }\hlsym{\}}\\
293 \hlline{111\ }\hlstd{\ }\hlkwa{return\ false}\hlstd{}\hlsym{;}\\
294 \hlline{112\ }\hlstd{}\hlsym{\}}\\
295 \hlline{113\ }\hlstd{}\\
296 \hlline{114\ }\hlkwb{void\ }\hlstd{}\hlkwd{trie\textunderscore debug}\hlstd{}\hlsym{(}\hlstd{Trie\ tr}\hlsym{,\ }\hlstd{}\hlkwb{int\ }\hlstd{depth}\hlsym{)\ \{}\\
297 \hlline{115\ }\hlstd{\ }\hlkwa{if\ }\hlstd{}\hlsym{(!}\hlstd{tr}\hlsym{)\ }\hlstd{}\hlkwa{return}\hlstd{}\hlsym{;}\\
298 \hlline{116\ }\hlstd{\ }\hlkwd{foralpha\ }\hlstd{}\hlsym{(}\hlstd{dig}\hlsym{)\ \{}\\
299 \hlline{117\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwa{if\ }\hlstd{}\hlsym{(!}\hlstd{tr}\hlsym{{-}$>$}\hlstd{children}\hlsym{{[}}\hlstd{dig}\hlsym{{]})\ }\hlstd{}\hlkwa{continue}\hlstd{}\hlsym{;}\\
300 \hlline{118\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{i}\hlsym{,\ }\hlstd{depth}\hlsym{)\ \{\ }\hlstd{cout\ }\hlsym{$<$$<$\ }\hlstd{}\hlstr{``\ }\hlstd{}\hlsym{;\ \}}\\
301 \hlline{119\ }\hlstd{}\hlstd{\ \ }\hlstd{cout\ }\hlsym{$<$$<$\ }\hlstd{}\hlkwd{itos}\hlstd{}\hlsym{(}\hlstd{dig}\hlsym{,\ }\hlstd{}\hlnum{1}\hlstd{}\hlsym{);}\\
302 \hlline{120\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwa{if\ }\hlstd{}\hlsym{(}\hlstd{tr}\hlsym{{-}$>$}\hlstd{children}\hlsym{{[}}\hlstd{dig}\hlsym{{]}{-}$>$}\hlstd{value}\hlsym{)\ \{}\\
303 \hlline{121\ }\hlstd{}\hlstd{\ \ \ }\hlstd{cout\ }\hlsym{$<$$<$\ }\hlstd{}\hlstr{"}\hlstd{\ \ }\hlstr{("}\hlstd{\ }\hlsym{$<$$<$\ {*}(}\hlstd{tr}\hlsym{{-}$>$}\hlstd{children}\hlsym{{[}}\hlstd{dig}\hlsym{{]}{-}$>$}\hlstd{value}\hlsym{)\ $<$$<$\ }\hlstd{}\hlstr{")"}\hlstd{}\hlsym{;}\\
304 \hlline{122\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlsym{\}}\\
305 \hlline{123\ }\hlstd{}\hlstd{\ \ }\hlstd{cout\ }\hlsym{$<$$<$\ }\hlstd{endl}\hlsym{;}\\
306 \hlline{124\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwd{trie\textunderscore debug}\hlstd{}\hlsym{(}\hlstd{tr}\hlsym{{-}$>$}\hlstd{children}\hlsym{{[}}\hlstd{dig}\hlsym{{]},\ }\hlstd{depth\ }\hlsym{+\ }\hlstd{}\hlnum{1}\hlstd{}\hlsym{);}\\
307 \hlline{125\ }\hlstd{\ }\hlsym{\}}\\
308 \hlline{126\ }\hlstd{}\hlsym{\}}\\
309 \hlline{127\ }\hlstd{}\\
310 \hlline{128\ }\hlcom{/{*}{*}{*}{*}\ Resultado\ {*}{*}{*}{*}/}\hlstd{}\\
311 \hlline{129\ }\\
312 \hlline{130\ }\hlkwc{typedef\ }\hlstd{pair}\hlsym{$<$}\hlstd{string}\hlsym{,\ }\hlstd{Value}\hlsym{$>$\ }\hlstd{ResultItem}\hlsym{;}\\
313 \hlline{131\ }\hlstd{vector}\hlsym{$<$}\hlstd{ResultItem}\hlsym{$>$\ }\hlstd{result}\hlsym{;}\\
314 \hlline{132\ }\hlstd{Value\ Invalid}\hlsym{;}\\
315 \hlline{133\ }\hlstd{}\\
316 \hlline{134\ }\hldir{\#define\ \textunderscore produce(S,\ V)}\hlstd{\ \ }\hldir{if\ ((V)\ !=\ Invalid)\ \{\ result.push\textunderscore back(ResultItem((S),\ (V)));\ \}}\\
317 \hlline{135\ }\hlstd{}\hldir{\#define\ Maxlen\ 20}\\
318 \hlline{136\ }\hlstd{}\hlkwb{char\ }\hlstd{prefix\textunderscore buf}\hlsym{{[}}\hlstd{Maxlen}\hlsym{{]};}\\
319 \hlline{137\ }\hlstd{}\hlkwb{void\ }\hlstd{}\hlkwd{\textunderscore build\textunderscore result\textunderscore rec}\hlstd{}\hlsym{(}\hlstd{Trie\ tr}\hlsym{,\ }\hlstd{}\hlkwb{int\ }\hlstd{prefix\textunderscore length}\hlsym{)\ \{}\\
320 \hlline{138\ }\hlstd{\ }\hlkwa{if\ }\hlstd{}\hlsym{(}\hlstd{tr\ }\hlsym{==\ }\hlstd{NULL}\hlsym{)\ }\hlstd{}\hlkwa{return}\hlstd{}\hlsym{;}\\
321 \hlline{139\ }\hlstd{\ }\hlkwa{if\ }\hlstd{}\hlsym{(!}\hlstd{}\hlkwd{trie\textunderscore has\textunderscore children}\hlstd{}\hlsym{(}\hlstd{tr}\hlsym{))\ \{}\\
322 \hlline{140\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlslc{//\ no\ children}\\
323 \hlline{141\ }\hlstd{}\hlstd{\ \ }\hlstd{prefix\textunderscore buf}\hlsym{{[}}\hlstd{prefix\textunderscore length}\hlsym{{]}\ =\ }\hlstd{}\hlstr{`$\backslash$0`}\hlstd{}\hlsym{;}\\
324 \hlline{142\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwd{\textunderscore produce}\hlstd{}\hlsym{(}\hlstd{}\hlkwd{string}\hlstd{}\hlsym{(}\hlstd{prefix\textunderscore buf}\hlsym{),\ }\hlstd{tr}\hlsym{{-}$>$}\hlstd{value}\hlsym{);}\\
325 \hlline{143\ }\hlstd{\ }\hlsym{\}\ }\hlstd{}\hlkwa{else\ }\hlstd{}\hlsym{\{}\\
326 \hlline{144\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlslc{//\ visit\ the\ children}\\
327 \hlline{145\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwd{foralpha\ }\hlstd{}\hlsym{(}\hlstd{dig}\hlsym{)\ \{}\\
328 \hlline{146\ }\hlstd{}\hlstd{\ \ \ }\hlstd{prefix\textunderscore buf}\hlsym{{[}}\hlstd{prefix\textunderscore length}\hlsym{{]}\ =\ }\hlstd{}\hlstr{`0`}\hlstd{\ }\hlsym{+\ }\hlstd{dig}\hlsym{;}\\
329 \hlline{147\ }\hlstd{}\hlstd{\ \ \ }\hlstd{}\hlkwd{\textunderscore build\textunderscore result\textunderscore rec}\hlstd{}\hlsym{(}\hlstd{tr}\hlsym{{-}$>$}\hlstd{children}\hlsym{{[}}\hlstd{dig}\hlsym{{]},\ }\hlstd{prefix\textunderscore length\ }\hlsym{+\ }\hlstd{}\hlnum{1}\hlstd{}\hlsym{);}\\
330 \hlline{148\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlsym{\}}\\
331 \hlline{149\ }\hlstd{\ }\hlsym{\}}\\
332 \hlline{150\ }\hlstd{}\hlsym{\}}\\
333 \hlline{151\ }\hlstd{}\\
334 \hlline{152\ }\hlkwb{void\ }\hlstd{}\hlkwd{trie\textunderscore print\textunderscore result}\hlstd{}\hlsym{(}\hlstd{Trie\ tr}\hlsym{)\ \{}\\
335 \hlline{153\ }\hlstd{\ Invalid\ }\hlsym{=\ }\hlstd{}\hlkwd{reg\textunderscore intern}\hlstd{}\hlsym{(}\hlstd{}\hlstr{"invalid"}\hlstd{}\hlsym{);}\\
336 \hlline{154\ }\hlstd{\ result\ }\hlsym{=\ }\hlstd{vector}\hlsym{$<$}\hlstd{ResultItem}\hlsym{$>$();}\\
337 \hlline{155\ }\hlstd{\\
338 \hlline{156\ }\ }\hlkwa{if\ }\hlstd{}\hlsym{(!}\hlstd{}\hlkwd{trie\textunderscore has\textunderscore children}\hlstd{}\hlsym{(}\hlstd{tr}\hlsym{)\ \&\&\ }\hlstd{tr}\hlsym{{-}$>$}\hlstd{value\ }\hlsym{!=\ }\hlstd{Empty\ }\hlsym{\&\&\ }\hlstd{tr}\hlsym{{-}$>$}\hlstd{value\ }\hlsym{!=\ }\hlstd{Invalid}\hlsym{)\ \{}\\
339 \hlline{157\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlslc{//\ special\ case:\ every\ prefix\ has\ the\ same\ type}\\
340 \hlline{158\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwd{printf}\hlstd{}\hlsym{(}\hlstd{}\hlstr{"\%d}\hlesc{$\backslash$n}\hlstr{"}\hlstd{}\hlsym{,}\hlstd{ALPHA\textunderscore SIZE}\hlsym{);}\\
341 \hlline{159\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwd{foralpha\ }\hlstd{}\hlsym{(}\hlstd{dig}\hlsym{)\ \{}\\
342 \hlline{160\ }\hlstd{}\hlstd{\ \ \ }\hlstd{}\hlkwd{printf}\hlstd{}\hlsym{(}\hlstd{}\hlstr{"\%d\ \%s}\hlesc{$\backslash$n}\hlstr{"}\hlstd{}\hlsym{,}\hlstd{dig}\hlsym{,({*}}\hlstd{tr}\hlsym{{-}$>$}\hlstd{value}\hlsym{).}\hlstd{}\hlkwd{c\textunderscore str}\hlstd{}\hlsym{());}\\
343 \hlline{161\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlsym{\}}\\
344 \hlline{162\ }\hlstd{\ }\hlsym{\}\ }\hlstd{}\hlkwa{else\ }\hlstd{}\hlsym{\{}\\
345 \hlline{163\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwd{\textunderscore build\textunderscore result\textunderscore rec}\hlstd{}\hlsym{(}\hlstd{tr}\hlsym{,\ }\hlstd{}\hlnum{0}\hlstd{}\hlsym{);}\\
346 \hlline{164\ }\hlstd{\\
347 \hlline{165\ }}\hlstd{\ \ }\hlstd{}\hlkwd{printf}\hlstd{}\hlsym{(}\hlstd{}\hlstr{"\%d}\hlesc{$\backslash$n}\hlstr{"}\hlstd{}\hlsym{,}\hlstd{result}\hlsym{.}\hlstd{}\hlkwd{size}\hlstd{}\hlsym{());}\\
348 \hlline{166\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{i}\hlsym{,\ (}\hlstd{}\hlkwb{int}\hlstd{}\hlsym{)}\hlstd{result}\hlsym{.}\hlstd{}\hlkwd{size}\hlstd{}\hlsym{())\ \{}\\
349 \hlline{167\ }\hlstd{}\hlstd{\ \ \ }\hlstd{}\hlkwd{printf}\hlstd{}\hlsym{(}\hlstd{}\hlstr{"\%s\ \%s}\hlesc{$\backslash$n}\hlstr{"}\hlstd{}\hlsym{,}\hlstd{result}\hlsym{{[}}\hlstd{i}\hlsym{{]}.}\hlstd{first}\hlsym{.}\hlstd{}\hlkwd{c\textunderscore str}\hlstd{}\hlsym{(),({*}}\hlstd{result}\hlsym{{[}}\hlstd{i}\hlsym{{]}.}\hlstd{second}\hlsym{).}\hlstd{}\hlkwd{c\textunderscore str}\hlstd{}\hlsym{());}\\
350 \hlline{168\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlsym{\}}\\
351 \hlline{169\ }\hlstd{\ }\hlsym{\}}\\
352 \hlline{170\ }\hlstd{}\hlsym{\}}\\
353 \hlline{171\ }\hlstd{}\\
354 \hlline{172\ }\hlcom{/{*}{*}{*}{*}\ Intervalos\ {*}{*}{*}{*}/}\hlstd{}\\
355 \hlline{173\ }\\
356 \hlline{174\ }\hldir{\#define\ IMP(X,\ Y)\ (!(X)\ \textbar \textbar \ (Y))}\\
357 \hlline{175\ }\hlstd{}\hlkwb{void\ }\hlstd{}\hlkwd{add\textunderscore interval}\hlstd{}\hlsym{(}\hlstd{Trie\ }\hlsym{{*}}\hlstd{tr}\hlsym{,\ }\hlstd{}\hlkwb{int\ }\hlstd{pref\textunderscore size}\hlsym{,\ }\hlstd{lluint\ from}\hlsym{,\ }\hlstd{lluint\ to}\hlsym{,\ }\hlstd{Value\ val}\hlsym{)\ \{}\\
358 \hlline{176\ }\hlstd{\ lluint\ pot\ }\hlsym{=\ }\hlstd{}\hlnum{1}\hlstd{}\hlsym{;}\\
359 \hlline{177\ }\hlstd{\ }\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{t}\hlsym{,\ }\hlstd{}\hlnum{2}\hlstd{}\hlsym{)\ \{}\\
360 \hlline{178\ }\hlstd{}\hlstd{\ \ }\hlstd{lluint\ }\hlsym{{*}}\hlstd{from\textunderscore to\ }\hlsym{=\ (}\hlstd{t\ }\hlsym{==\ }\hlstd{}\hlnum{0\ }\hlstd{?\ }\hlsym{\&}\hlstd{from\ }\hlsym{:\ \&}\hlstd{to}\hlsym{);}\\
361 \hlline{179\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwa{while\ }\hlstd{}\hlsym{(}\hlstd{pot\ }\hlsym{$>$\ }\hlstd{}\hlnum{0\ }\hlstd{}\hlsym{\&\&\ }\hlstd{}\hlkwd{IMP}\hlstd{}\hlsym{(}\hlstd{t\ }\hlsym{==\ }\hlstd{}\hlnum{0}\hlstd{}\hlsym{,\ }\hlstd{from\ }\hlsym{+\ }\hlstd{pot\ }\hlsym{$<$=\ }\hlstd{to}\hlsym{))\ \{}\\
362 \hlline{180\ }\hlstd{}\hlstd{\ \ \ }\hlstd{}\hlkwa{while\ }\hlstd{}\hlsym{(}\hlstd{from\ }\hlsym{+\ }\hlstd{pot\ }\hlsym{$<$=\ }\hlstd{to\ }\hlsym{\&\&\ {*}}\hlstd{from\textunderscore to\ }\hlsym{\%\ (}\hlstd{pot\ }\hlsym{{*}\ }\hlstd{}\hlnum{10}\hlstd{}\hlsym{)\ $>$\ }\hlstd{}\hlnum{0}\hlstd{}\hlsym{)\ \{}\\
363 \hlline{181\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{string\ }\hlkwd{element}\hlstd{}\hlsym{(}\hlstd{}\hlkwd{itos}\hlstd{}\hlsym{(}\hlstd{from\ }\hlsym{/\ }\hlstd{pot}\hlsym{,\ }\hlstd{pref\textunderscore size}\hlsym{));}\\
364 \hlline{182\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{}\hlkwd{trie\textunderscore add}\hlstd{}\hlsym{(}\hlstd{tr}\hlsym{,\ }\hlstd{element}\hlsym{.}\hlstd{}\hlkwd{c\textunderscore str}\hlstd{}\hlsym{(),\ }\hlstd{val}\hlsym{);}\\
365 \hlline{183\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{from\ }\hlsym{+=\ }\hlstd{pot}\hlsym{;}\\
366 \hlline{184\ }\hlstd{}\hlstd{\ \ \ }\hlstd{}\hlsym{\}}\\
367 \hlline{185\ }\hlstd{}\hlstd{\ \ \ }\hlstd{}\hlkwa{if\ }\hlstd{}\hlsym{(}\hlstd{t\ }\hlsym{==\ }\hlstd{}\hlnum{0}\hlstd{}\hlsym{)\ \{}\\
368 \hlline{186\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{pot\ }\hlsym{{*}=\ }\hlstd{}\hlnum{10}\hlstd{}\hlsym{;}\\
369 \hlline{187\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{pref\textunderscore size}\hlsym{{-}{-};}\\
370 \hlline{188\ }\hlstd{}\hlstd{\ \ \ }\hlstd{}\hlsym{\}\ }\hlstd{}\hlkwa{else\ }\hlstd{}\hlsym{\{}\\
371 \hlline{189\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{pot\ }\hlsym{/=\ }\hlstd{}\hlnum{10}\hlstd{}\hlsym{;}\\
372 \hlline{190\ }\hlstd{}\hlstd{\ \ \ \ }\hlstd{pref\textunderscore size}\hlsym{++;}\\
373 \hlline{191\ }\hlstd{}\hlstd{\ \ \ }\hlstd{}\hlsym{\}}\\
374 \hlline{192\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlsym{\}}\\
375 \hlline{193\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwa{if\ }\hlstd{}\hlsym{(}\hlstd{t\ }\hlsym{==\ }\hlstd{}\hlnum{1}\hlstd{}\hlsym{)\ }\hlstd{}\hlkwa{break}\hlstd{}\hlsym{;}\\
376 \hlline{194\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwa{while\ }\hlstd{}\hlsym{(}\hlstd{from\ }\hlsym{+\ }\hlstd{pot\ }\hlsym{$>$\ }\hlstd{to}\hlsym{)\ \{\ }\hlstd{pot\ }\hlsym{/=\ }\hlstd{}\hlnum{10}\hlstd{}\hlsym{;\ }\hlstd{pref\textunderscore size}\hlsym{++;\ \}}\\
377 \hlline{195\ }\hlstd{\ }\hlsym{\}}\\
378 \hlline{196\ }\hlstd{}\hlsym{\}}\\
379 \hlline{197\ }\hlstd{\\
380 \hlline{198\ }lluint\ }\hlkwd{atoll\textunderscore }\hlstd{}\hlsym{(}\hlstd{string\ s}\hlsym{)\ \{}\\
381 \hlline{199\ }\hlstd{\ lluint\ r\ }\hlsym{=\ }\hlstd{}\hlnum{0}\hlstd{}\hlsym{;}\\
382 \hlline{200\ }\hlstd{\ }\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{i}\hlsym{,\ }\hlstd{s}\hlsym{.}\hlstd{}\hlkwd{size}\hlstd{}\hlsym{())\ \{}\\
383 \hlline{201\ }\hlstd{}\hlstd{\ \ }\hlstd{r\ }\hlsym{=\ }\hlstd{}\hlnum{10\ }\hlstd{}\hlsym{{*}\ }\hlstd{r\ }\hlsym{+\ }\hlstd{}\hlkwd{ALPHA\textunderscore VAL}\hlstd{}\hlsym{(}\hlstd{s}\hlsym{{[}}\hlstd{i}\hlsym{{]});}\\
384 \hlline{202\ }\hlstd{\ }\hlsym{\}}\\
385 \hlline{203\ }\hlstd{\ }\hlkwa{return\ }\hlstd{r}\hlsym{;}\\
386 \hlline{204\ }\hlstd{}\hlsym{\}}\\
387 \hlline{205\ }\hlstd{}\\
388 \hlline{206\ }\hlcom{/{*}{*}{*}{*}\ Main\ {*}{*}{*}{*}/}\hlstd{}\\
389 \hlline{207\ }\\
390 \hlline{208\ }\hlkwb{struct\ }\hlstd{InputItem\ }\hlsym{\{}\\
391 \hlline{209\ }\hlstd{\ }\hlkwb{int\ }\hlstd{pref\textunderscore size}\hlsym{;}\\
392 \hlline{210\ }\hlstd{\ lluint\ from}\hlsym{,\ }\hlstd{to}\hlsym{;}\\
393 \hlline{211\ }\hlstd{\ Value\ name\textunderscore id}\hlsym{;}\\
394 \hlline{212\ }\hlstd{}\hlsym{\};}\\
395 \hlline{213\ }\hlstd{}\hlkwb{int\ }\hlstd{}\hlkwd{main}\hlstd{}\hlsym{()\ \{}\\
396 \hlline{214\ }\hlstd{\ }\hlkwb{bool\ }\hlstd{primero\ }\hlsym{=\ }\hlstd{}\hlkwa{true}\hlstd{}\hlsym{;}\\
397 \hlline{215\ }\hlstd{\ }\hlkwa{while\ }\hlstd{}\hlsym{(}\hlstd{}\hlkwa{true}\hlstd{}\hlsym{)\ \{}\\
398 \hlline{216\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwb{int\ }\hlstd{nlines}\hlsym{;}\\
399 \hlline{217\ }\hlstd{}\hlstd{\ \ }\hlstd{cin\ }\hlsym{$>$$>$\ }\hlstd{nlines}\hlsym{;}\\
400 \hlline{218\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwa{if\ }\hlstd{}\hlsym{(}\hlstd{cin}\hlsym{.}\hlstd{}\hlkwd{eof}\hlstd{}\hlsym{())\ }\hlstd{}\hlkwa{break}\hlstd{}\hlsym{;}\\
401 \hlline{219\ }\hlstd{\\
402 \hlline{220\ }}\hlstd{\ \ }\hlstd{}\hlkwa{if\ }\hlstd{}\hlsym{(}\hlstd{primero}\hlsym{)\ \{}\\
403 \hlline{221\ }\hlstd{}\hlstd{\ \ \ }\hlstd{primero\ }\hlsym{=\ }\hlstd{}\hlkwa{false}\hlstd{}\hlsym{;}\\
404 \hlline{222\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlsym{\}\ }\hlstd{}\hlkwa{else\ }\hlstd{}\hlsym{\{}\\
405 \hlline{223\ }\hlstd{}\hlstd{\ \ \ }\hlstd{}\hlkwd{printf}\hlstd{}\hlsym{(}\hlstd{}\hlstr{"}\hlesc{$\backslash$n}\hlstr{"}\hlstd{}\hlsym{);}\\
406 \hlline{224\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlsym{\}}\\
407 \hlline{225\ }\hlstd{\\
408 \hlline{226\ }}\hlstd{\ \ }\hlstd{vector}\hlsym{$<$}\hlstd{InputItem}\hlsym{$>$\ }\hlstd{todo\textunderscore list}\hlsym{;}\\
409 \hlline{227\ }\hlstd{\\
410 \hlline{228\ }}\hlstd{\ \ }\hlstd{}\hlslc{//\ Read\ the\ lines\ and\ build\ the\ todo\ list}\\
411 \hlline{229\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwd{forn\ }\hlstd{}\hlsym{(}\hlstd{line}\hlsym{,\ }\hlstd{nlines}\hlsym{)\ \{}\\
412 \hlline{230\ }\hlstd{}\hlstd{\ \ \ }\hlstd{string\ from}\hlsym{,\ }\hlstd{sep}\hlsym{,\ }\hlstd{to}\hlsym{,\ }\hlstd{name}\hlsym{;}\\
413 \hlline{231\ }\hlstd{}\hlstd{\ \ \ }\hlstd{cin\ }\hlsym{$>$$>$\ }\hlstd{from\ }\hlsym{$>$$>$\ }\hlstd{sep\ }\hlsym{$>$$>$\ }\hlstd{to\ }\hlsym{$>$$>$\ }\hlstd{name}\hlsym{;}\\
414 \hlline{232\ }\hlstd{\\
415 \hlline{233\ }}\hlstd{\ \ \ }\hlstd{}\hlkwb{int\ }\hlstd{k\ }\hlsym{=\ }\hlstd{from}\hlsym{.}\hlstd{}\hlkwd{size}\hlstd{}\hlsym{()\ {-}\ }\hlstd{to}\hlsym{.}\hlstd{}\hlkwd{size}\hlstd{}\hlsym{();}\\
416 \hlline{234\ }\hlstd{}\hlstd{\ \ \ }\hlstd{InputItem\ item}\hlsym{;}\\
417 \hlline{235\ }\hlstd{}\hlstd{\ \ \ }\hlstd{item}\hlsym{.}\hlstd{name\textunderscore id\ }\hlsym{=\ }\hlstd{}\hlkwd{reg\textunderscore intern}\hlstd{}\hlsym{(}\hlstd{name}\hlsym{);}\\
418 \hlline{236\ }\hlstd{}\hlstd{\ \ \ }\hlstd{item}\hlsym{.}\hlstd{from\ }\hlsym{=\ }\hlstd{}\hlkwd{atoll\textunderscore }\hlstd{}\hlsym{(}\hlstd{from}\hlsym{);}\\
419 \hlline{237\ }\hlstd{}\hlstd{\ \ \ }\hlstd{item}\hlsym{.}\hlstd{to\ }\hlsym{=\ }\hlstd{}\hlkwd{atoll\textunderscore }\hlstd{}\hlsym{(}\hlstd{from}\hlsym{.}\hlstd{}\hlkwd{substr}\hlstd{}\hlsym{(}\hlstd{}\hlnum{0}\hlstd{}\hlsym{,\ }\hlstd{k}\hlsym{)\ +\ }\hlstd{to}\hlsym{)\ +\ }\hlstd{}\hlnum{1}\hlstd{}\hlsym{;}\\
420 \hlline{238\ }\hlstd{}\hlstd{\ \ \ }\hlstd{item}\hlsym{.}\hlstd{pref\textunderscore size\ }\hlsym{=\ }\hlstd{from}\hlsym{.}\hlstd{}\hlkwd{size}\hlstd{}\hlsym{();}\\
421 \hlline{239\ }\hlstd{\\
422 \hlline{240\ }}\hlstd{\ \ \ }\hlstd{todo\textunderscore list}\hlsym{.}\hlstd{}\hlkwd{push\textunderscore back}\hlstd{}\hlsym{(}\hlstd{item}\hlsym{);}\\
423 \hlline{241\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlsym{\}}\\
424 \hlline{242\ }\hlstd{\\
425 \hlline{243\ }}\hlstd{\ \ }\hlstd{}\hlslc{//\ Process\ the\ lines\ in\ reverse\ order}\\
426 \hlline{244\ }\hlstd{}\hlstd{\ \ }\hlstd{Trie\ tr\ }\hlsym{=\ }\hlstd{}\hlkwd{trie\textunderscore new}\hlstd{}\hlsym{();}\\
427 \hlline{245\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwd{dforn\ }\hlstd{}\hlsym{(}\hlstd{i}\hlsym{,\ }\hlstd{nlines}\hlsym{)\ \{}\\
428 \hlline{246\ }\hlstd{}\hlstd{\ \ \ }\hlstd{InputItem}\hlsym{\&\ }\hlstd{}\hlkwd{item}\hlstd{}\hlsym{(}\hlstd{todo\textunderscore list}\hlsym{{[}}\hlstd{i}\hlsym{{]});}\\
429 \hlline{247\ }\hlstd{}\hlstd{\ \ \ }\hlstd{}\hlkwd{add\textunderscore interval}\hlstd{}\hlsym{(\&}\hlstd{tr}\hlsym{,\ }\hlstd{item}\hlsym{.}\hlstd{pref\textunderscore size}\hlsym{,\ }\hlstd{item}\hlsym{.}\hlstd{from}\hlsym{,\ }\hlstd{item}\hlsym{.}\hlstd{to}\hlsym{,\ }\hlstd{item}\hlsym{.}\hlstd{name\textunderscore id}\hlsym{);}\\
430 \hlline{248\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlsym{\}}\\
431 \hlline{249\ }\hlstd{\\
432 \hlline{250\ }}\hlstd{\ \ }\hlstd{}\hlkwd{trie\textunderscore print\textunderscore result}\hlstd{}\hlsym{(}\hlstd{tr}\hlsym{);}\\
433 \hlline{251\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwd{trie\textunderscore free}\hlstd{}\hlsym{(}\hlstd{tr}\hlsym{);}\\
434 \hlline{252\ }\hlstd{}\hlstd{\ \ }\hlstd{}\hlkwd{reg\textunderscore free}\hlstd{}\hlsym{();}\\
435 \hlline{253\ }\hlstd{\ }\hlsym{\}}\\
436 \hlline{254\ }\hlstd{\\
437 \hlline{255\ }\ }\hlkwa{return\ }\hlstd{}\hlnum{0}\hlstd{}\hlsym{;}\\
438 \hlline{256\ }\hlstd{}\hlsym{\}}\hlstd{}\\
439 \mbox{}
440 \normalfont
441 \shorthandon{"}